package com.ycl2.imports.lisner;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.ycl2.imports.entity.Importexcel;
import com.ycl2.imports.service.IImportexcelService;
import com.ycl2.imports.service.impl.ImportexcelServiceImpl;
import com.ycl2.imports.task.MyTask02;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * @description:
 * @projectName:zbf-jiaoyianquan
 * @see:com.ycl.imports.lisner
 * @author:袁成龙
 * @createTime:2020/10/20 8:42
 * @version:1.0
 */
// 有个很重要的点 DemoDataListener 不能被spring管理，要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Component
public class EasyExcelImport extends AnalysisEventListener<Importexcel>  {

    Map<String,Object> map=new HashMap<>();


    private RabbitTemplate rabbitTemplate;

        int i = 0;

        private static final Logger LOGGER = LoggerFactory.getLogger(EasyExcelImport.class);
        /**
         * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
         */
        private static final int BATCH_COUNT = 3000;
        List<Importexcel> list = new ArrayList<>();

//        @Autowired
//        private Map<Integer,List<Importexcel>> map;
        /*Map<Integer,List<Importexcel>> map = new HashMap<>();*/
        /**
         * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        private ImportexcelServiceImpl demoDAO;

        public EasyExcelImport() {
            // 这里是demo，所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
            demoDAO = new ImportexcelServiceImpl();
        }

        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         *
         * @param demoDAO
         */
        public EasyExcelImport(ImportexcelServiceImpl demoDAO,RabbitTemplate rabbitTemplate) {
            this.demoDAO = demoDAO;
            this.rabbitTemplate=rabbitTemplate;
        }

        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data
         *
         * @param context
         */
        @Override
        public void invoke(Importexcel data, AnalysisContext context) {
            //    LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
            list.add(data);
            // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
            if (list.size() >= BATCH_COUNT) {
               // map.put(i,list);
               // System.out.println(list.size());
                saveData1();
               // i++;
                // 存储完成清理 list
                list.clear();
            }
        }

        /**
         * 所有数据解析完成了 都会来调用
         *
         * @param context
         */
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 这里也要保存数据，确保最后遗留的数据也存储到数据库
            saveData1();
          //  LOGGER.info("所有数据解析完成！");
        }


        /**
         * @Author 袁成龙
         * @Description //TODO 处理没有分好的数据
         * @Date 13:33 2020/10/20
         * @Param
         * @return
         **/
        private void saveData1() {
            boolean b = demoDAO.saveBatch(list);
            if(b){
                double i = 25.0/(250000/3000.0);
                String result = String.format("%.1f", i);
                Double integer = Double.valueOf(result);
                // System.out.println("=================================================="+result);
                map.put("num",integer);
                map.put("isOk",0);
                String string = JSON.toJSONString(map);
                rabbitTemplate.convertAndSend("T-Exchange1","",string);
            }
        }
}